/* 1. http.js文件（./src/request/http.js）*/
import axios from 'axios'
import QS from 'qs'
import { Toast } from 'vant'
import router from '../router'
/* 配置请求基本信息 */
axios.defaults.timeout = 5000 // 超时时间
axios.defaults.headers.post['Content-Type'] =
  'application/x-www-form-urlencoded;charset=UTF-8' //请求头类型，form表单提交

/* 从build中获取到构建的环境类型，进而获取到确切的地址配置 */
/* process.env.NODE_ENV 来自于 build(./src/build/build.js)中的配置信息。*/
// const url = "http://mockdata";
/* 配置请求拦截器 */
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token
    // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    // config.url = 'http://localhost:8888' + config.url
    return config
  },
  error => {
    return Promise.error(error)
  }
)
/* 配置响应拦截器，具体项目，具体定制*/
axios.interceptors.response.use(
  response => {
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误
    // if (response.data.flag === '-99') {
    //   // -99 即后台权限验证失败的返回值，则返回到登陆页面
    //   localStorage.removeItem('token')
    //   router.replace({ path: '/login' })
    //   return
    // }
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  // 下面列举几个常见的操作，其他需求可自行扩展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          })
          break

        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          Toast({
            message: '登录过期，请重新登录',
            duration: 1000,
            forbidClick: true
          })
          // 清除token
          localStorage.removeItem('token')
          // store.commit("loginSuccess", null);
          // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: '/login',
              query: {
                redirect: router.currentRoute.fullPath
              }
            })
          }, 1000)
          break

        // 404请求不存在
        case 404:
          Toast.fail({
            message: '网络请求不存在',
            duration: 1500,
            forbidClick: true
          })
          break
        // 其他错误，直接抛出错误提示
        default:
          Toast.fail({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true
          })
      }
      return Promise.reject(error.response)
    }
  }
)
/* 配置get方法，可以直接使用this.get(url,param) 进行调用*/
export function get(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/* 配置post方法(form表单提交数据方式)，可以直接使用this.post(url,param) 进行调用*/
export function post(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, QS.stringify(params, { indices: false }))
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/* 配置postJson方法(json数据提交方式)，替换配置请求头类型，可以直接使用this.postJon(url,param) 进行调用*/
export function postJson(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, JSON.stringify(params), {
        headers: {
          'Content-Type': 'application/json'
        }
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/* 配置postFormData方法(文件file数据提交方式)，替换配置请求头类型，可以直接使用this.postFormData(url,param) 进行调用*/
export function postFormData(url, formData) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
